[PATCH] [MC][ELF] Work around R_MIPS_LO16 relocation handling problem
authorDimitry Andric <dimitry@andric.com>
Mon, 3 May 2021 18:08:49 +0000 (20:08 +0200)
committerGianfranco Costamagna <locutusofborg@debian.org>
Mon, 31 Jul 2023 20:16:10 +0000 (21:16 +0100)
commit448f4d29f43eb8ccc0bda74510f37dfd8d4bd9d2
tree201df052b78ea353cc52d09416b570963da3c0f7
parentd078a618d4252d9c5896a84255dec15d19c5087a
[PATCH] [MC][ELF] Work around R_MIPS_LO16 relocation handling problem

This fixes PR49821, and avoids "ld.lld: error: test.o:(.rodata.str1.1):
offset is outside the section" errors when linking MIPS objects with
negative R_MIPS_LO16 implicit addends.

ld.lld handles R_MIPS_HI16/R_MIPS_LO16 separately, not as a whole, so it
doesn't know that an R_MIPS_HI16 with implicit addend 1 and an
R_MIPS_LO16 with implicit addend -32768 represents 32768, which is in
range of a MergeInputSection. We could introduce a new RelExpr member
(like R_RISCV_PC_INDIRECT for R_RISCV_PCREL_HI20 / R_RISCV_PCREL_LO12)
but the complexity is unnecessary given that GNU as keeps the original
symbol for this case as well.

Reviewed By: atanasyan, MaskRay

Differential Revision: https://reviews.llvm.org/D101773

Gbp-Pq: Topic mips
Gbp-Pq: Name mips-D101773-reloc.patch
llvm/lib/MC/ELFObjectWriter.cpp